2024年10月版 - AWS Tools for PowerShell V5の開発状況について
しばたです。
今年の8月にAWS SDK for .NETのメジャーバージョンアップとなるV4のプレビューリリースがあり、それに合わせてAWS Tools for PowerShellのメジャーバージョンアップとなるV5の開発方針もアナウンスされました。
その後、今月に入り最初のプレビューリリースとなる AWS Tools for PowerShell Ver.5.0.0-preview001 がリリースされたので現在の状況を共有したいと思います。
AWS Tools for PowerShell V5の開発方針
前掲のブログにある通りAWS Tools for PowerShell V5はAWS SDK .NET V4をベースにして実装されます。
(現行のAWS Tools for PowerShell V4はAWS SDK .NET V3ベース)
リリース時期に関してはAWS SDK .NET V4のリリース予定がまだ未定のため、AWS Tools for PowerShell V5のリリース予定も未定となっています。
現時点では以下で説明する破壊的変更が入る予定となっており、AWS SDK .NET V4の破壊的変更に起因するものとAWS Tools for PowerShell独自判断によるものそれぞれ存在しています。
1. サポート対象となるPowerShellのバージョン
現行のAWS Tools for PowerShellは
- AWSPowerShell モジュール
- AWSPowerShell.NetCore モジュール
- サービス毎の AWS.Tools.* なモジュール
の3種類ありますが、このうちAWSPowerShellモジュールがPowerShell 5.1のみのサポートに変わる予定です。
(現在はPowerShell 3.0 ~ 5.1のサポート)
これはAWS SDK .NET V4が.NET Framework 4.7.2以降のみのサポートになるのを受けての事ですが、本日時点でサポートされているWindowsクライアントおよびWindows Serverは全てPowerShell 5.1環境しかない点も含まれていると思います。
- 参考 : Updating minimum requirements to Windows PowerShell 3.0 and .NET Framework 4.5
- Windows Server 2008 R2系のサポート終了によりAWSPowerShellモジュールの最低サポートバージョンが引き上げられたときのアナウンス
AWSのブログではAWSPowerShell.NetCoreモジュールについては一切触れられていませんでしたが、こちらも同様にサポートバージョンが引き上げられるのではと予想します。
2. null許容型プロパティの扱い
AWS SDK for .NET V4から各種クラスのプロパティをnull許容型で扱う様になり、AWS Tools for PowerShell V5においてもこの変更がそのまま引き継がれます。
一例を出すと、EC2インスタンスの情報を取得するGet-EC2Instance
コマンドレットの戻り値の一部はAWS SDK for .NETのAmazon.EC2.Model.Instanceクラスになります。[1]
このクラスにあるEbsOptimized
プロパティはAWS SDK for .NET V3まではSystem.Boolean
型ですが、V4からSystem.Nullable<System.Boolean>
型になり、AWS Tools for PowerShellにおいてもBoolean
→ Nullable<Boolean>
型への変更が発生します。
AWS Tools for PowerShellでは多くの場合においてAWS SDK for .NETのクラスをそのまま利用しているので当然と言えば当然の挙動です。
ただ、スクリプト言語であるPowerShellは元々当たり前にnullを許容しており、null許容型と元の型を透過的に変換します。
このため基本的な利用においてこの変更は無視できるはずです。
プロパティの型を取得して何らかの条件判定をしている様なケースにおいては処理の見直しが必要になることがあります。
3. コレクション初期値の扱い
AWS SDK for .NET V4では不要なメモリアロケーションを減らすことを目的として、List
型とDictionary
型プロパティの初期値が空のコレクションからnullに変更されます。
前項同様AWS Tools for PowerShellにおいても空コレクション
→ null
への変更が発生します。
こちらは非常に影響範囲の大きい破壊的変更なのでAWS SDK for .NETでは後方互換用の設定が用意されているのですが、AWS Tools for PowerShellでどうなるかは明記されていません。
AWSブログでは
Some cmdlet output will change to return $null instead of empty collections.
とあり、後方互換のための設定は用意されない予感がします...
$AWSHistory
変数の廃止
4. 次に、AWS Tools for PowerShell V5ではコマンドレットの実行履歴やレスポンス内容の履歴を保存していた$AWSHistory
変数が廃止されます。
これはAWS Tools for PowerShell V4で導入された-Select
パラメーターによって導入当初の目的を代替できるという判断からの決定です。
AWS_PROFILE
環境変数のサポート
5. 最後にAWS Tools for PowerShell V5ではAWS CLIと同様にAWS_PROFILE
環境変数から利用するプロファイルを選べる様になります。
こちらはシンプルな内容ですが非常に嬉しい改善です。
AWS Tools for PowerShell Ver.5.0.0-preview001
ブログのアナウンスと同時期にGitHub上にも開発状況を共有するためのIssueが公開されました。
その後、今月下旬に最初のプレビュー版となるVer.5.0.0-preview001のリリースがアナウンスされています。
このバージョンでは
- AWSPowerShellモジュールのサポートバージョンを変更 (PowerShell 5.1のみに)
- AWS SDK for .NET V4の利用によるnull許容型の利用とコレクション初期値null化の適用
$AWSHistory
変数を削除- 一部コマンドから使われなくなった
-PassThru
パラメーターを削除 - 従来のDynamoDBモジュールからDynamoDB Stream関連の機能を分離
- AWS CLIの構成と近い形にした模様
- S3モジュールにいくつかのコマンドレットを追加
- AWS SDK for .NET V4でサポートされた追加API分を実装
といった更新が加えられています。
残念ながらAWS_PROFILE
環境変数のサポートはまだでした。
プレビュー版ですので本番環境での利用は非推奨です。
また、モジュールのオートロードが出来ない様で、明示的に共通機能となるAWS.Tools.Common
モジュールのインポートが必要でした。
動作確認
ここからは簡単に動作確認しておきます。
手っ取り早く使い捨ての環境を用意したかったので今回はAWS CloudShellを使うことにしました。
本日時点でCloudShell上のPowerShellはVer.7.4.5です。
CloudShellにはデフォルトでAWS Tools for PowerShell V4がインストール済みなので、Bash上で以下のコマンドを実行し既存のモジュールを全て削除しておきます。
# あらかじめCloudShellにデフォルトインストール済みのモジュールを削除
sudo rm -rf /opt/microsoft/powershell/7/Modules/AWS.Tools.*
この状態でPowerShellを起動し、AWS関連のモジュールが無くなっていることを確認しておきます。
# AWS関連のモジュールが無いことを確認
PS /> Get-Module -ListAvailable -Name AWS*
PS />
PS /> Get-InstalledModule
PS />
モジュールのインストール
AWS Tools for PowerShell Ver.5.0.0-preview001はPowerShell Galleryに登録済みですのでInstall-Module
コマンドを使い各種モジュールをインストールします。
今回はGitHubの手順に追加でAWS.Tools.EC2
モジュールもインストールしてみました。
なお、現時点ではAWS.Tools.Installer
を使ったインストールだと不具合があるとのことでした。
# プレビュー版なので -AllowPrerelease を付けてインストールする
Install-Module -Name AWS.Tools.Common -AllowPrerelease -Repository PSGallery -Force
Install-Module -Name AWS.Tools.S3 -AllowPrerelease -Repository PSGallery -Force
Install-Module -Name AWS.Tools.EC2 -AllowPrerelease -Repository PSGallery -Force
エラー無く処理が終わればOKで、結果は以下の通りです。
PS /> Get-InstalledModule | Format-Table -AutoSize
Version Name Repository Description
------- ---- ---------- -----------
5.0.0-preview001 AWS.Tools.EC2 PSGallery The EC2 module of AWS Tools for PowerShell …
5.0.0-preview001 AWS.Tools.Common PSGallery The AWS Tools for PowerShell lets developer…
5.0.0-preview001 AWS.Tools.S3 PSGallery The S3 module of AWS Tools for PowerShell l…
モジュールの利用
現時点ではモジュールを利用する際はAWS.Tools.Common
を明示的にインポートする必要があります。
たとえば先にAWS.Tools.EC2
モジュールをインポートしようとすると次のエラーとなってしまいます。
# AWS.Tools.Common をインポートしない場合に発生するエラー
PS /> Import-Module -Name AWS.Tools.EC2
Import-Module: Could not load file or assembly 'AWS.Tools.Common, Version=5.0.0.0, Culture=neutral, PublicKeyToken=f3c454fc91f52a42'. The system cannot find the file specified.
このためAWS.Tools.Common
→ その他モジュール
の順にインポートしてください。
(ちなみにAWS.Tools.Common
のインポートだけで済む場合が多いです)
# 利用するモジュールを適宜インポートする
Import-Module -Name AWS.Tools.Common
Import-Module -Name AWS.Tools.S3
Import-Module -Name AWS.Tools.EC2
あとは従来通りの利用をするだけです。
# EC2インスタンスの一覧を取得
PS /> Get-EC2Instance -Select Reservations.Instances
InstanceId InstanceType Platform PrivateIpAddress PublicIpAddress SecurityGroups
---------- ------------ -------- ---------------- --------------- --------------
i-099afd9xxxxxxxxxx t4g.micro 10.0.11.xxx {xxxxxxxxxxxx…
i-03daa1cxxxxxxxxxx t2.micro 10.0.21.xxx {xxxxxxxxxxxx…
i-045518xxxxxxxxxxx t3.small Windows 10.0.11.xxx {xxxxxxxxxxxx…
i-0d6c4dxxxxxxxxxxx t3.small 10.0.11.xxx {xxxxxxxxxxxx…
前節で解説した通り、戻り値のプロパティの型がnull許容型(System.Nullable[T])になっています。
# 一部プロパティの型がnull許容型 (System.Nullable[bool] など) になっている
PS /> Get-EC2Instance -Select Reservations.Instances | Get-Member
TypeName: Amazon.EC2.Model.Instance
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AmiLaunchIndex Property System.Nullable[int] AmiLaunchIndex {…
#
# ・・・省略・・・
#
EbsOptimized Property System.Nullable[bool] EbsOptimized {g…
#
# ・・・省略・・・
#
TpmSupport Property string TpmSupport {get;set;}
UsageOperation Property string UsageOperation {get;set;}
UsageOperationUpdateTime Property System.Nullable[datetime] UsageOperat…
VirtualizationType Property Amazon.EC2.VirtualizationType Virtual…
VpcId Property string VpcId {get;set;}
とはいえPowerShellではnull許容型を意識せずそのまま扱えます。
# PowerShellにおいてnull許容型は透過的に処理される
PS /> $instance = Get-EC2Instance -Select Reservations.Instances | Select-Object -First 1
PS /> $instance.EbsOptimized
True
# プロパティの型を直接取得しようとしても System.Nullable[bool] ではなく System.Boolean になる
PS /> $instance.EbsOptimized | Get-Member
TypeName: System.Boolean
#
# ・・・後略・・・
#
また、戻り値のうちコレクションとなるプロパティを適当に選ぶと確かに$null
が返されました。
# ElasticGpuAssociations プロパティの初期値が確かにnullになっている
PS /> $null -eq $instance.ElasticGpuAssociations
True
# 値が無いので GetType() メソッドは失敗する
PS /> $instance.ElasticGpuAssociations.GetType()
InvalidOperation: You cannot call a method on a null-valued expression.
# 比較用 : AWS Tools for PowerShell V4では空コレクションが初期値
PS /> $null -eq $instance.ElasticGpuAssociations
False
# 値があるので GetType() メソッドが成功し型情報を取れる
PS /> $instance.ElasticGpuAssociations.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True List`1 System.Object
PowerShellにおいて空コレクションの扱いは結構なクセがあり、個人的にはnullになってくれる方がまだ直感的に扱えると思うものの、これはかなり大きい破壊的変更なので要注意ですね。
そして各種コマンドを実行しても$AWSHistory
変数は現れず確かに削除済みでした。
# AWSHistory 変数は削除済み
PS /> dir variable:AWS*
PS />
余談
今回は試しませんが、AWSPowerShellモジュール、AWSPowerShell.NetCoreモジュールもプレビュー版がリリースされています。
EC2上でAWS Tools for PowerShellをご利用の方はAWSPowerShellモジュールを使った検証を行っておくと良いかもしれません。
最後に
以上となります。
最初のプレビュー版がリリースされたばかりであり、まだ将来的にどうなるか未知数なところがあります。
今後も情報を追っていきますので何かあればブログでお伝えしたいと思います。
直接の戻り値は Amazon.EC2.Model.Reservation クラス ↩︎